import requests
from runtime import Args
from typing import TypedDict
# 移除未使用的 json 导入
# 修改导入，使用本地定义的 Input 和 Output 类
# 因为依赖中给出的 Output 是 TypedDict，修改使用方式

class Input:
    api_url: str  # 监控工具API端点
    api_key: str  # 认证密钥
    server_id: str  # 服务器唯一标识
    metrics: list[str]  # 需获取的指标列表

class Output(TypedDict, total=False):
    status: str  # 执行状态（success/error）
    message: str  # 状态描述
    metrics: dict  # 指标数据（键值对：指标名-数值）
    timestamp: str  # 数据时间戳


"""
服务器监控工具API对接插件
功能：获取指定服务器的监控指标（CPU/内存/响应时间等）
"""

def handler(args: Args[Input]) -> Output:
    try:
        # 从输入参数获取监控工具配置
        api_url = args.input.api_url  # 监控工具API地址
        api_key = args.input.api_key  # 认证密钥
        server_id = args.input.server_id  # 目标服务器ID
        metrics = args.input.metrics  # 需获取的指标列表（如["cpu","memory","response_time"]）

        # 构造请求头（含认证信息）
        headers = {
            "Authorization": f"Bearer {api_key}",
            "Content-Type": "application/json"
        }

        # 构造请求参数（指定服务器和指标）
        params = {
            "server_id": server_id,
            "metrics": ",".join(metrics),
            "timestamp": "latest"  # 获取最新数据
        }

        # 发送API请求
        response = requests.get(
            url=api_url,
            headers=headers,
            params=params,
            timeout=10
        )

        # 处理响应
        if response.status_code == 200:
            # 解析监控数据（假设返回格式为{"metrics": {指标: 值, ...}, "timestamp": "..."}）
            data = response.json()
            return Output(
                   status="success",
                   message="指标数据获取成功",
                   metrics=data.get("metrics", {}),
                   timestamp=data.get("timestamp", ""))
        else:
                                    return Output(
                                        status="error",
                                        message=f"API请求失败，状态码：{response.status_code}",
                                        metrics={},
                                        timestamp=""
                                    )
    except Exception as e:
                                args.logger.error(f"获取监控指标异常：{str(e)}")
                                return Output(
                                    status="error",
                                    message=f"系统异常：{str(e)}",
                                    metrics={},
                                    timestamp=""
                                )
